package com.kexio.file.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kexio.file.domain.FileInfo;

/**
 * 文件信息Mapper
 * 
 * @author kexio
 */
@Mapper
public interface FileInfoMapper extends BaseMapper<FileInfo> {

    /**
     * 根据文件哈希查询文件
     */
    FileInfo selectByFileHash(@Param("fileHash") String fileHash);

    /**
     * 根据业务信息查询文件列表
     */
    List<FileInfo> selectByBusiness(@Param("businessType") String businessType, 
                                   @Param("businessId") String businessId);

    /**
     * 根据用户ID查询文件列表
     */
    List<FileInfo> selectByUserId(@Param("userId") Long userId);

    /**
     * 分页查询文件
     */
    IPage<FileInfo> selectPage(Page<FileInfo> page,
                               @Param("businessType") String businessType,
                               @Param("businessId") String businessId,
                               @Param("userId") Long userId,
                               @Param("status") Integer status);

    /**
     * 统计文件数量
     */
    Long countFiles(@Param("businessType") String businessType, 
                    @Param("userId") Long userId, 
                    @Param("status") Integer status);

    /**
     * 统计文件总大小
     */
    Long sumFileSize(@Param("businessType") String businessType, 
                     @Param("userId") Long userId, 
                     @Param("status") Integer status);

    /**
     * 统计文件总下载次数
     */
    Long sumDownloadCount(@Param("businessType") String businessType, 
                          @Param("userId") Long userId, 
                          @Param("status") Integer status);

    /**
     * 批量更新文件状态
     */
    int batchUpdateStatus(@Param("fileIds") List<Long> fileIds, 
                          @Param("status") Integer status);

    /**
     * 软删除文件
     */
    int softDeleteById(@Param("fileId") Long fileId);

    /**
     * 批量软删除文件
     */
    int batchSoftDelete(@Param("fileIds") List<Long> fileIds);

    /**
     * 更新文件下载统计
     */
    int updateDownloadStats(@Param("fileId") Long fileId, 
                           @Param("downloadCount") Integer downloadCount,
                           @Param("lastAccessTime") java.time.LocalDateTime lastAccessTime);

    /**
     * 查询即将过期的临时文件
     */
    List<FileInfo> selectExpiredTempFiles(@Param("expireTime") java.time.LocalDateTime expireTime);

    /**
     * 查询孤儿文件（没有业务关联的文件）
     */
    List<FileInfo> selectOrphanFiles(@Param("createTimeBefore") java.time.LocalDateTime createTimeBefore);
}
